package com.zan.zanchat.common.user.controller;


import com.zan.zanchat.common.common.domain.dto.RequestInfo;
import com.zan.zanchat.common.common.domain.vo.resp.ApiResult;
import com.zan.zanchat.common.common.utils.AssertUtil;
import com.zan.zanchat.common.common.utils.RequestHolder;
import com.zan.zanchat.common.user.domain.enums.RoleEnum;
import com.zan.zanchat.common.user.domain.vo.req.BlackReq;
import com.zan.zanchat.common.user.domain.vo.req.ModifyNameReq;
import com.zan.zanchat.common.user.domain.vo.req.WearingBadgeReq;
import com.zan.zanchat.common.user.domain.vo.resp.BadgeResp;
import com.zan.zanchat.common.user.domain.vo.resp.UserInfoResp;
import com.zan.zanchat.common.user.service.IRoleService;
import com.zan.zanchat.common.user.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;

/**
 * <p>
 * 用户表 前端控制器
 * </p>
 *
 * @author <a href="https://gitee.com/zan421">Zan</a>
 * @since 2024-03-07
 */
@RestController
@RequestMapping("/capi/user")
@Api(tags = "用户模块", value = "用户相关接口")
public class UserController {

    @Resource
    private UserService userService;

    @Resource
    private IRoleService roleService;

    /**
     * 一般来说可以使用/public/来进行登录限制，在拦截器中判断第三个是不是public，如果是那么就不用登录就可以查看，需要的不写
     * 这里不应该传uid，前端传什么就是什么吗，不应该这样，我们应该通过token的拦截器，将uid进行解析，然后传递到这里，返给前端
     */
    @GetMapping("/userInfo")
    @ApiOperation("获取用户个人信息")
    public ApiResult<UserInfoResp> getUserInfo() {
        RequestInfo requestInfo = RequestHolder.get();
        return ApiResult.success(userService.getUserInfo(requestInfo.getUid()));
    }

    /**
     * Void相当于不返回
     * @Valid 注解代表使用注解来进行校验，而不是自己写逻辑进行校验
     */
    @PutMapping("/name")
    @ApiOperation("修改用户名")
    public ApiResult<Void> modifyName(@Valid @RequestBody ModifyNameReq req) {
        userService.modifyName(RequestHolder.get().getUid(), req.getName());
        // 上面如果异常了，就会跑到前面自定义异常BusinessException去，从里面的return出去，就不会走到下面的return成功了，在前面就已经return出去了
        return ApiResult.success();
    }

    @GetMapping("/badges")
    @ApiOperation("获取可选徽章列表预览")
    public ApiResult<List<BadgeResp>> badges() {
        return ApiResult.success(userService.badges(RequestHolder.get().getUid()));
    }

    @PutMapping("/wearing")
    @ApiOperation("佩戴徽章")
    public ApiResult<Void> wearingBadge(@Valid @RequestBody WearingBadgeReq req) {
        userService.wearingBadge(RequestHolder.get().getUid(), req.getItemId());
        return ApiResult.success();
    }

    @PutMapping("/black")
    @ApiOperation("拉黑用户")
    public ApiResult<Void> black(@Valid @RequestBody BlackReq req) {
        Long uid = RequestHolder.get().getUid();
        boolean hasPower = roleService.hasPower(uid, RoleEnum.CHAT_MANAGER);
        AssertUtil.isTrue(hasPower, "Zan管理员没权限");
        userService.black(req);
        return ApiResult.success();
    }


}


